/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Juegos;

import Estados.*;

/**
 *
 * @author Alvaro
 */

/*Operadores:
 Transportar Canibal,Canibal Canibal,
 Misionero, Misionero Misionero,
 Misionero Canibal
 */
public class Misioneros extends Juego{

    


    public Misioneros(Estado ini){
        super(ini,5);

    }

    public eMisioneros operar(int x, Estado in) {
        eMisioneros nuevo=null;
        eMisioneros e=(eMisioneros) in;
        switch(x){
            case 0:{
                    nuevo=cc(e);
                    if(nuevo!=null) nuevo.setCoste(2);
                    break;}
            case 1:{
                nuevo=mm(e);
                if(nuevo!=null) nuevo.setCoste(2);
                break;
            }
            case 2:{
                nuevo=c(e);
                if(nuevo!=null) nuevo.setCoste(1);
                break;
            }
            case 3:{
                nuevo=m(e);
                if(nuevo!=null) nuevo.setCoste(1);
                break;
            }
            case 4:{
                nuevo=cm(e);
                if(nuevo!=null) nuevo.setCoste(2);
                break;
            }
        }
        return nuevo;
    }

    public eMisioneros cc(eMisioneros e){//Canibal Canibal
        eMisioneros nuevo = null;
        int[] situacion={e.getSituacion()[0],e.getSituacion()[1],e.getSituacion()[2]};
        if(e.getSituacion()[1]>=2 && e.getSituacion()[2]==1){
            situacion[1]-=2;
            situacion[2]=0;
            nuevo=new eMisioneros(e,situacion);
        }
        else if(e.getSituacion()[1]<2 && e.getSituacion()[2]==0){
           // situacion[0]=e.getSituacion()[0];
            situacion[1]+=2;//e.getSituacion()[1]+2;
            situacion[2]=1;
            nuevo=new eMisioneros(e,situacion);}
        return nuevo;
    }

    public eMisioneros mm(eMisioneros e){//misionero misionero
        eMisioneros nuevo = null;
        int[] situacion={e.getSituacion()[0],e.getSituacion()[1],e.getSituacion()[2]};
        if(e.getSituacion()[0]>=2 && e.getSituacion()[2]==1){
            situacion[0]-=2;
            situacion[2]=0;
            nuevo=new eMisioneros(e,situacion);
        }
        else if(e.getSituacion()[0]<2 && e.getSituacion()[2]==0){
            situacion[0]+=2;
            situacion[2]=1;
            nuevo=new eMisioneros(e,situacion);}
        return nuevo;
    }

    public eMisioneros c(eMisioneros e){//canibal
        eMisioneros nuevo = null;
        int[] situacion={e.getSituacion()[0],e.getSituacion()[1],e.getSituacion()[2]};
        if(e.getSituacion()[1]>=1 && e.getSituacion()[2]==1){
            situacion[1]-=1;
            situacion[2]=0;
            nuevo=new eMisioneros(e,situacion);
        }
        else if(e.getSituacion()[1]<3 && e.getSituacion()[2]==0){
            situacion[1]+=1;
            situacion[2]=1;
            nuevo=new eMisioneros(e,situacion);}
        return nuevo;
    }

    public eMisioneros m(eMisioneros e){//misionero
        eMisioneros nuevo = null;
        int[] situacion={e.getSituacion()[0],e.getSituacion()[1],e.getSituacion()[2]};
        if(e.getSituacion()[0]>=1 && e.getSituacion()[2]==1){
            situacion[0]-=1;
            situacion[2]=0;
            nuevo=new eMisioneros(e,situacion);
        }
        else if(e.getSituacion()[0]<3 && e.getSituacion()[2]==0){
            situacion[0]+=1;
            situacion[2]=1;
            nuevo=new eMisioneros(e,situacion);}
        return nuevo;
    }

    public eMisioneros cm(eMisioneros e){//canibal y misionero
        eMisioneros nuevo = null;
        int[] situacion={e.getSituacion()[0],e.getSituacion()[1],e.getSituacion()[2]};
        if(e.getSituacion()[0]>=1 && e.getSituacion()[1]>=1 && e.getSituacion()[2]==1){
            situacion[0]-=1;
            situacion[1]-=1;
            situacion[2]=0;
            nuevo=new eMisioneros(e,situacion);
        }
        else if(e.getSituacion()[0]<3 && e.getSituacion()[1]<3 && e.getSituacion()[2]==0){
            situacion[0]+=1;
            situacion[1]+=1;
            situacion[2]=1;
            nuevo=new eMisioneros(e,situacion);}
        return nuevo;
    }

    public boolean esInicial(eMisioneros e) {
        int[] situacion=e.getSituacion();
        return situacion[0]==3 && situacion[1]==3 && situacion[2]==1;
    }


    public boolean esFinal(eMisioneros e) {
        int[] situacion=e.getSituacion();
        return situacion[0]==0 && situacion[1]==0 && situacion[2]==0;
    }


    public boolean esPeligro(Estado o) {
        eMisioneros e= (eMisioneros) o;
        int[] situacion=e.getSituacion();
        return situacion[1]>situacion[0] && situacion[0]!=0
                || situacion[1]<situacion[0] && situacion[0]!=3;
    }

    @Override
    public boolean esInicial(Estado o) {
        eMisioneros e=(eMisioneros) o;
        int[] situacion=e.getSituacion();
        return situacion[0]==3 && situacion[1]==3 && situacion[2]==1;
    }

    @Override
    public boolean esFinal(Estado o) {
        eMisioneros e= (eMisioneros) o;
        int[] situacion=e.getSituacion();
        return situacion[0]==0 && situacion[1]==0 && situacion[2]==0;
    }

}
